/**
 * fregues.cpp
 * Autores: Danilo S. Carvalho	- 107390588
 * 			Taísa L. Martins	- 107362828 
 *
 */

#include "fregues.h"

namespace SimuladorAD
{

	Fregues::Fregues(){
	
		m_id = 0;
		m_cor = 0;
		
		m_fila_atual = 0;

		m_tempo_chegada = 0.0;
		m_tempo_ini_servico1 = 0.0;

		m_tempo_fim_servico1 = 0.0;
		m_tempo_servico2 = 0.0;
		m_servico2_recebido = 0.0;
		m_tempo_espera2 = 0.0;
		m_tempo_saida = 0.0;

		m_pessoas_espera_fila1 = 0;
		m_pessoas_espera_fila2 = 0;
		m_tipo_cliente_em_servico = 0;

	}

    Fregues::Fregues(int id, int cor, double t_chegada, int pessoas_fila1, int pessoas_fila2, int tipo_em_servico)
    {
		m_id = id;
		m_cor = cor;
		
		m_fila_atual = 1;

		m_tempo_chegada = t_chegada;
		m_tempo_ini_servico1 = -1.0;

		m_tempo_fim_servico1 = -1.0;
		m_tempo_servico2 = -1.0;
		m_servico2_recebido = 0.0;
		m_tempo_espera2 = 0.0;
		m_tempo_saida = -1.0;

		m_pessoas_espera_fila1 = pessoas_fila1;
		m_pessoas_espera_fila2 = pessoas_fila2;
		m_tipo_cliente_em_servico = tipo_em_servico;
    }


	int Fregues::id (void){
		return m_id;      
    }

    int Fregues::cor (void){
		return m_cor;
    }

    int Fregues::fila_atual (void){
		return m_fila_atual;
    }

    double Fregues::tempo_espera_fila1(void){
		return m_tempo_ini_servico1 - m_tempo_chegada;
    }

    double Fregues::tempo_servico_1(void){
		return m_tempo_fim_servico1 - m_tempo_ini_servico1;
    }

    double Fregues::tempo_total_fila1(void){
		return m_tempo_fim_servico1 - m_tempo_chegada;
    }

    double Fregues::tempo_espera_fila2(void){
		return  m_tempo_espera2;
    }

    double Fregues::tempo_servico_2(void){
		return m_tempo_servico2;
    }
    
    double Fregues::servico_2_residual (void){
		return m_tempo_servico2 - m_servico2_recebido;
    }

    double Fregues::tempo_total_fila2(void){
		return m_tempo_saida - m_tempo_fim_servico1;
    }

    int Fregues::pessoas_espera_fila1 (void){
		return m_pessoas_espera_fila1;
    }

    int Fregues::total_pessoas_fila1 (void){
      
		if(m_tipo_cliente_em_servico == 1)
			return m_pessoas_espera_fila1 + 1;
	  
		return m_pessoas_espera_fila1;
    }

    int Fregues::pessoas_espera_fila2 (void){
		return m_pessoas_espera_fila2;
    }

    int Fregues::total_pessoas_fila2 (void){
      
		if(m_tipo_cliente_em_servico == 2)
			return m_pessoas_espera_fila2 + 1;
	  
		return m_pessoas_espera_fila2;
    }

    void Fregues::entra_servico_1 (double tempo){
		m_tempo_ini_servico1 = tempo;
    }

    void Fregues::entra_fila_2 (double tempo){
		m_tempo_fim_servico1 = tempo;
		m_tempo_espera2 -= tempo;
        m_fila_atual = 2;
    }
    
    void Fregues::volta_fila_2 (double tempo_em_servico, double tempo_atual){
		m_servico2_recebido += tempo_em_servico;
		m_tempo_espera2 -= tempo_atual;
    }

    void Fregues::entra_servico_2 (double tempo_do_servico, double tempo_atual){
		if(m_tempo_servico2 < 0)
			m_tempo_servico2 = tempo_do_servico;
		m_tempo_espera2 += tempo_atual; 
    }

    void Fregues::sai_sistema (double tempo){
		m_tempo_saida = tempo;      
    }
	
	 /** Imprime dados detalhados do freguês para fins de depuração 
	  *  e teste de corretude.
	  */
	 void Fregues::print()
    {
        printf("*************************\n");

        printf("Dados do Fregues %d\n", m_id);
        printf("X1 = %f\n", tempo_servico_1());
        printf("W1 = %f\n", tempo_espera_fila1());
        printf("T1 = %f\n", tempo_total_fila1());
        printf("Nq1 = %d\n", pessoas_espera_fila1());
        printf("N1 = %d\n", total_pessoas_fila1());

        printf("X2 = %f\n", tempo_servico_2());
        printf("W2 = %f\n", tempo_espera_fila2());
        printf("T2 = %f\n", tempo_total_fila2());
        printf("Nq2 = %d\n", pessoas_espera_fila2());
        printf("N2 = %d\n", total_pessoas_fila2());

        printf("*************************\n\n");
    }  
}
